package ln.javatest.day18.demo01;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;

//框架类实现：
// 1.配置文件       2.反射
//  步骤:1.将需要创建的对象的全类名和需要执行的方法定义在配置文件中
//      2.在程序中加载读取配置文件
//      3.使用反射技术来加载类文件进内存
//      4.创建对象
//      5.执行方法
public class ReflectTest {
    public static void main(String[] args) throws Exception {
        //可以创建任意类的对象，可以执行任意方法
        //前提：不能改变该类的任何代码，可以创建任意类的对象，可以执行任意方法
        /*Person p = new Person();
        p.eat();
        Student stu = new Student();
        stu.sleep();*/

        //1.加载配置文件
        //1.1创建Properties对象
        Properties pro = new Properties();
        //1.2加载配置文件，转换为一个集合
        //1.2.1获取class目录下的配置文件
        ClassLoader classLoader = ReflectTest.class.getClassLoader();//获取字节码文件的类加载器
        InputStream is = classLoader.getResourceAsStream("pro.properties");
        //getResource:获取资源路径 getResourceAsStream：获取资源对应的字节流
        //1.3加载
        pro.load(is);

        //2.获取配置文件中定义的数据
        //Properties集合存储的键值对，这里的getProperty方法就是通过key获取value
        String clsN = pro.getProperty("className");
        String mN = pro.getProperty("methodName");

        //3.加载该类进内存
        Class cls = Class.forName(clsN);
        //4.创建对象cls.newInstance()（已过时）替换为cls.getDeclaredConstructor().newInstance();
        Object obj = cls.getDeclaredConstructor().newInstance();
        //5.获取方法对象
        Method method = cls.getMethod(mN);
        //执行对象
        method.invoke(obj);
    }
}
